home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / vbcc / machines / amiga68k / frontend / vc.c
Encoding:
C/C++ Source or Header  |  1995-10-16  |  9.4 KB  |  291 lines

  1. /*  Frontend fuer vbcc Amiga-Version        */
  2. /*  (c) in 1995 by Volker Barthelmann       */
  3. /*  benutzt viel mehr Speicher als noetig,  */
  4. /*  um sicher zu gehen, ohne gross          */
  5. /*  rumzurechnen                            */
  6. /*  Wildcards erst ab dos.library>=36       */
  7.  
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <dos/dos.h>
  11. #include <dos/dosasl.h>
  12. #include <exec/libraries.h>
  13. #include <clib/dos_protos.h>
  14.  
  15. extern struct Library *DOSBase;
  16.  
  17. struct NameList{
  18.     struct NameList *next;
  19.     char *obj;
  20. } *first_obj=0,*last_obj=0,*first_scratch=0,*last_scratch=0;
  21.  
  22. /*  Limit fuer Laenge der Namen (wegen Wildcards)   */
  23. #define NAMEBUF 1000
  24. #define USERLIBS 1000
  25.  
  26. #define VERBOSE 256
  27. #define VERYVERBOSE 128
  28. #define KEEPSCRATCH 64
  29.  
  30. #define PPSRC 1
  31. #define CCSRC 2
  32. #define ASSRC 3
  33. #define OBJ 4
  34.  
  35. /*  Namen der einzelnen Phasen  */
  36. char *ppname="dcpp %s >%s",
  37.      *ccname="vbcc -quiet ",
  38.      *asname="FreePhxAss opt ! quiet %s to %s",
  39.      *ldname="blink vlib:startup.o %s lib %s vlib:vc.lib vlib:amiga.lib to %s",
  40.      *rmname="delete quiet %s";
  41. /*  dasselbe fuer VERBOSE   */
  42. char *ppv="dcpp %s >%s",
  43.      *ccv="vbcc ",
  44.      *asv="FreePhxAss opt ! %s to %s",
  45.      *ldv="blink vlib:startup.o %s lib %s vlib:vc.lib vlib:amiga.lib to %s",
  46.      *rmv="delete %s";
  47.  
  48. /*  String fuer die Default libraries   */
  49. char userlibs[USERLIBS];
  50. char *nomem="Not enough memory!\n";
  51.  
  52. char *destname="a.out";
  53.  
  54. char *config;
  55. char **confp;
  56.  
  57. int typ(char *);
  58. char *add_suffix(char *,char *);
  59. void raus(int);
  60.  
  61. char *command,*options,*linkcmd,*objects,*libs;
  62. struct AnchorPath *ap;
  63.  
  64. int linklen=10,flags=0;
  65.  
  66. void free_namelist(struct NameList *p)
  67. {
  68.     struct NameList *m;
  69.     while(p){
  70.         m=p->next;
  71.         if(flags&VERYVERBOSE){
  72.             puts("free p->obj");
  73.             if(!p->obj) puts("IS ZERO!!"); else puts(p->obj);
  74.         }
  75.         free((void *)p->obj);
  76.         if(flags&VERYVERBOSE){puts("free p"); if(!p) puts("IS ZERO!!");}
  77.         free((void *)p);
  78.         p=m;
  79.     }
  80. }
  81. void del_scratch(struct NameList *p)
  82. {
  83.     while(p){
  84.         sprintf(command,rmname,p->obj);
  85.         if(flags&VERBOSE) printf("%s\n",command);
  86.         if(system(command)){printf("%s failed\n",command);raus(20);}
  87.         p=p->next;
  88.     }
  89. }
  90. void raus(int rc)
  91. {
  92.     if(confp)   free(confp);
  93.     if(config)  free(config);
  94.     if(objects) free(objects);
  95.     if(libs)    free(libs);
  96.     if(command) free(command);
  97.     if(options) free(options);
  98.     if(linkcmd) free(linkcmd);
  99.     if(ap) free(ap);
  100.     free_namelist(first_obj);
  101.     free_namelist(first_scratch);
  102.     exit(rc);
  103. }
  104. void add_name(char *obj,struct NameList **first,struct NameList **last)
  105. {
  106.     struct NameList *new;
  107.     if(flags&VERYVERBOSE) printf("add_name: %s\n",obj);
  108.     if(!(new=(struct NameList *)malloc(sizeof(struct NameList))))
  109.         {printf(nomem);raus(20);}
  110.     if(!(new->obj=(char *)malloc(strlen(obj)+1)))
  111.         {free((void *)new);printf(nomem);raus(20);}
  112.     if(first==&first_obj) linklen+=strlen(obj)+1;
  113.     strcpy(new->obj,obj);
  114.     new->next=0;
  115.     if(!*first){
  116.         *first=*last=new;
  117.     }else{
  118.         (*last)->next=new;*last=new;
  119.     }
  120. }
  121. int read_config(void)
  122. {
  123.     BPTR l;struct FileInfoBlock fib;int i,count;
  124.     long size;BPTR file;char *configname="ENV:vc.config",*p;
  125.     l=Lock(configname,-2);
  126.     if(!l){configname="VBCC:vc.config";l=Lock(configname,-2);}
  127.     if(!l) return(0);
  128.     if(!Examine(l,&fib)){puts("Examine() failed!");raus(EXIT_FAILURE);}
  129.     size=fib.fib_Size;
  130.     config=malloc(size);
  131.     if(!config){printf(nomem);raus(EXIT_FAILURE);}
  132.     UnLock(l);
  133.     file=Open(configname,MODE_OLDFILE);
  134.     if(!file) return(0);
  135.     size=Read(file,config,size);
  136.     Close(file);
  137.     count=0;p=config;
  138.     while(*p&&p<config+size){
  139.         count++;
  140.         while(*p!='\n'&&p<config+size) p++;
  141.         if(*p=='\n') *p++=0;
  142.     }
  143.     confp=malloc(count*sizeof(char *));
  144.     for(p=config,i=0;i<count;i++){
  145.         confp[i]=p;
  146.         while(*p) p++;
  147.         p++;
  148.     }
  149.     return(count);
  150. }
  151.  
  152. int main(int argc,char *argv[])
  153. {
  154.     int i,opt=1,len=10,pm,count;char *parm;
  155.     char oldfile[NAMEBUF+2];
  156.     count=read_config();
  157.     if(pm=DOSBase->lib_Version>=36){
  158.         if(ap=(struct AnchorPath *)calloc(sizeof(struct AnchorPath)+NAMEBUF,1))
  159.             {ap->ap_Strlen=NAMEBUF;ap->ap_BreakBits=0;} else pm=0;
  160.     }
  161.     for(i=1;i<argc+count;i++){
  162.         if(i<argc) parm=argv[i]; else parm=confp[i-argc];
  163. /*        printf("Parameter %d=%s\n",i,parm);*/
  164.         if(!strncmp(parm,"-pp=",4)){ppname=parm+4;*parm=0;}
  165.         if(!strncmp(parm,"-as=",4)){asname=parm+4;*parm=0;}
  166.         if(!strncmp(parm,"-ld=",4)){ldname=parm+4;*parm=0;}
  167.         if(!strncmp(parm,"-rm=",4)){rmname=parm+4;*parm=0;}
  168.         if(!strncmp(parm,"-ppv=",5)){ppv=parm+5;*parm=0;}
  169.         if(!strncmp(parm,"-asv=",5)){asv=parm+5;*parm=0;}
  170.         if(!strncmp(parm,"-ldv=",5)){ldv=parm+5;*parm=0;}
  171.         if(!strncmp(parm,"-rmv=",5)){rmv=parm+5;*parm=0;}
  172.         if(!strcmp(parm,"-E")) {flags|=CCSRC;*parm=0;}
  173.         if(!strcmp(parm,"-S")) {flags|=ASSRC;*parm=0;}
  174.         if(!strcmp(parm,"-c")) {flags|=OBJ;*parm=0;}
  175.         if(!strcmp(parm,"-v")) {flags|=VERBOSE;*parm=0;}
  176.         if(!strcmp(parm,"-k")) {flags|=KEEPSCRATCH;*parm=0;}
  177.         if(!strcmp(parm,"-vv")) {flags|=VERBOSE|VERYVERBOSE;*parm=0;}
  178.         if(!strncmp(parm,"-O",2)){
  179.             if(parm[2]=='0') opt=0;
  180.             if(parm[2]>='2') opt=1023;
  181.             *parm=0;
  182.         }
  183.         if(!strcmp(parm,"-o")&&i<argc-1) {
  184.             *argv[i++]=0;destname=argv[i];
  185.             argv[i]="";continue;
  186.         }
  187.         if(parm[0]=='-'&&parm[1]=='l'){
  188.             if((strlen(userlibs)+strlen(parm)+15)>=USERLIBS){puts("Userlibs too long");exit(20);}
  189.             strcat(userlibs," vlib:");
  190.             strcat(userlibs,parm+2);
  191.             strcat(userlibs,".lib");
  192.             *parm=0;continue;
  193.         }
  194.         len+=strlen(parm)+10;
  195.     }
  196.     if(flags&VERBOSE) printf("vc frontend for vbcc (c) in 1995 by Volker Barthelmann\n");
  197.     if(!(flags&7)) flags|=5;
  198.     if(flags&VERYVERBOSE){ppname=ppv;ccname=ccv;asname=asv;ldname=ldv;rmname=rmv;}
  199.     /*  Nummer sicher...    */
  200.     len+=strlen(ppname)+strlen(ccname)+strlen(asname)+strlen(rmname)+strlen(userlibs)+NAMEBUF;
  201.     if(!(command=malloc(len))){printf(nomem);raus(20);}
  202.     if(!(options=malloc(len))){printf(nomem);raus(20);}
  203.     *options=0;
  204.     for(i=1;i<argc+count;i++){
  205.         if(i<argc) parm=argv[i]; else parm=confp[i-argc];
  206.         if(*parm=='-') {strcat(options,parm);strcat(options," ");}
  207.     }
  208.     if(flags&VERYVERBOSE) printf("flags=%d opt=%d len=%d\n",flags,opt,len);
  209.     for(i=1;i<argc;i++){
  210.         int t,j;char *file;
  211.         if(i<argc) parm=argv[i]; else parm=confp[i-argc];
  212.         if(*parm=='-'||!*parm) continue;
  213.         if(flags&VERYVERBOSE) printf("Argument %d:%s\n",i,parm);
  214.         if(pm) if(MatchFirst(parm,ap)) {printf("No match for %s\n",parm);continue;}
  215.         do{
  216.             if(pm) file=(char *)&ap->ap_Buf[0]; else file=parm;
  217.             t=typ(file);
  218.             if(flags&VERYVERBOSE) printf("File %s=%d\n",file,t);
  219.             for(j=t;j<(flags&7);j++){
  220.                 if(j==OBJ){ if(j==t) add_name(file,&first_obj,&last_obj);
  221.                             continue;}
  222.                 strcpy(oldfile,file);
  223.                 if(j==PPSRC){
  224.                     file=add_suffix(file,".i");
  225.                     sprintf(command,ppname,oldfile,file);
  226.                     if((flags&7)!=CCSRC) add_name(file,&first_scratch,&last_scratch);
  227.                 }
  228.                 if(j==CCSRC){
  229.                     file=add_suffix(file,".asm");
  230.                     sprintf(command,"%s -O=%-4d %s %s",ccname,opt,options,oldfile);
  231.                     if((flags&7)!=ASSRC) add_name(file,&first_scratch,&last_scratch);
  232.                 }
  233.                 if(j==ASSRC){
  234.                     file=add_suffix(file,".o");
  235.                     sprintf(command,asname,oldfile,file);
  236.                     add_name(file,&first_obj,&last_obj);
  237.                     if((flags&7)!=OBJ) add_name(file,&first_scratch,&last_scratch);
  238.                 }
  239.                 if(flags&VERBOSE) printf("%s\n",command);
  240.                 if(system(command)){printf("%s failed\n",command);raus(20);}
  241.             }
  242.         }while(pm&&!MatchNext(ap));
  243.         if(pm) MatchEnd(ap);
  244.     }
  245.     if((flags&7)>OBJ){
  246.     /*  Zu Executable linken    */
  247.         struct NameList *p;
  248.         objects=malloc(linklen);
  249.         if(!objects){printf(nomem);raus(EXIT_FAILURE);}
  250.         linklen+=strlen(ldname)+strlen(destname)+strlen(userlibs)+10;
  251.         if(flags&VERYVERBOSE) printf("linklen=%d\n",linklen);
  252.         if(!(linkcmd=(char *)malloc(linklen))){printf(nomem);raus(20);}
  253.         p=first_obj;*objects=0;
  254.         while(p){
  255.             if(p->obj){strcat(objects,p->obj);strcat(objects," ");}
  256.             p=p->next;
  257.         }
  258.         if(*objects){
  259.             sprintf(linkcmd,ldname,objects,userlibs,destname);
  260.             if(flags&VERBOSE) printf("%s\n",linkcmd);
  261.             if(system(linkcmd)){printf("%s failed\n",linkcmd);raus(20);}
  262.         }else puts("No objects to link");
  263.     }
  264.     if(!(flags&KEEPSCRATCH)) del_scratch(first_scratch);
  265.     raus(0);
  266. }
  267.  
  268. int typ(char *p)
  269. {
  270.     p=strrchr(p,'.');
  271.     if(!p) return(5);
  272.     if(!strcmp(p,".c")) return(PPSRC);
  273.     if(!strcmp(p,".i")) return(CCSRC);
  274.     if(!strcmp(p,".s")) return(ASSRC);
  275.     if(!strcmp(p,".asm")) return(ASSRC);
  276.     if(!strcmp(p,".o")) return(OBJ);
  277.     if(!strcmp(p,".obj")) return(OBJ);
  278.     return(5);
  279. }
  280.  
  281. char *add_suffix(char *s,char *suffix)
  282. {
  283.     static char str[NAMEBUF+2],*p;
  284.     if(strlen(s)+strlen(suffix)>NAMEBUF){printf("string too long\n");raus(20);}
  285.     if(s!=str) strcpy(str,s);
  286.     p=strrchr(str,'.');
  287.     if(!p) p=str+strlen(s);
  288.     strcpy(p,suffix);
  289.     return(str);
  290. }
  291.